local M = _G.ServerOHOH.class.new(script,_G.ServerOHOH.files.Server_PlayerComponent(),script.Parent.Name);
local CarTool=_G.CommonOHOH.load.CarTool();
local ConnectClass=_G.CommonOHOH.load.Connect();

function M.new(self,...)
    M(self,...);
end

function M.ctor(self,parent)
    M.super.ctor(self,parent)
    self.player = self.parent
    self.UpdateEvent=ConnectClass.new()

    self.DataStore = self.parent:GetComponent(_G.ServerOHOH.load.Server_PlayerDataComponent());
    self.player.RollResultEvent:Connect(function(carIdList)
        for _,carId in pairs(carIdList) do
            local cfg=CarTool.GetPartCfgData(carId)
            local  equipId=self.equipType2Id[cfg.type]
            if not equipId then --不存在该类型的装备
                self:EquipCarId(carId)  --更新装备
                self:UpdateSkinCarId(carId) --更新皮肤数据
                self:UpdateValue() --更新整车属性
                self.parent:SynchDataToClient("car")
            elseif equipId~=carId and CarTool.IsBetter(carId,equipId) then--存在，但新得到的更好
                self:EquipCarId(carId,equipId)--更新装备
                self:UpdateSkinCarId(carId) --更皮肤数据
                self:UpdateValue()--更新整车属性
                self.parent:SynchDataToClient("car")
            end
        end
    end)
    
    self.hpScale=1 --当前血量为最大血量的百分比
    self:UpdateValue()

    self.player.EnterBattleEvent:Connect(function(isEnter)
            if  isEnter then --进入战斗

            else --离开战斗
                self:ResetHP() --退出战斗，清空血量
            end
    end)
end

-- 添加自然数
function M.AddNaturalValue(self,value,propertyType)
    if propertyType==1 then --  血量
        self.baseHp= self.baseHp+value
    elseif  propertyType==2 then --攻击力
        self.baseAttack= self.baseAttack+value
    elseif  propertyType==3 then --推进力
        self.basePropulsion= self.basePropulsion+value
    end
end

--添加比例数
function M.AddProportionValue(self,value,propertyType)
    if propertyType==1 then --  血量
        self.baseHpScale= self.baseHpScale+value
    elseif  propertyType==2 then --攻击力
        self.baseAttackScale= self.baseAttackScale+value
    elseif  propertyType==3 then --推进力
        self.basePropulsionScale= self.basePropulsionScale+value
    end
end


--装备部件
function M.EquipCarId(self,carId,oldCarId)
    local equip=self.DataStore:GetData("car").equip.__real
    if oldCarId then
        for k,id in pairs(equip) do
           if id==oldCarId then
                 table.remove(equip,k)
                 break
           end
        end
    end
    table.insert(equip,carId)
    self.DataStore:GetData("car").equip.__real=equip
    local cfg=CarTool.GetPartCfgData(carId)
    self.equipType2Id[cfg.type]=carId
end

--更新皮肤数据
function M.UpdateSkinCarId(self,carId)
    local skin=self.DataStore:GetData("car").skin.__real
    local newType=CarTool.GetPartCfgData(carId,true).type --获取该部件的类型（五大部件之一）、

    for cid,v in pairs(skin) do
        local carType=CarTool.GetPartCfgData(cid,true).type
        if carType==newType then 
            if v==1 then --已经被锁定，无需修改皮肤
                return 
            else
                skin[cid]=nil
                skin[carId]=0  
            end

            return 
        end
    end

    skin[carId]=0 

end
function M.UpdateValue(self)
    local carData=self.DataStore:GetData("car").equip.__real
    self.baseHp=0
    self.baseAttack=0
    self.basePropulsion=0

    self.baseHpScale=1
    self.baseAttackScale=1
    self.basePropulsionScale=1

    self.equipType2Id={}-- 五大部件类型 对应的Id
    for _,carId in pairs(carData) do
        local cfg=CarTool.GetPartCfgData(carId)
        self.equipType2Id[cfg.type]=carId
        if cfg.valueType==1 then --自然数
             for k,v in pairs(cfg.value) do
                self:AddNaturalValue(v,cfg.property[k])
             end
           
        elseif cfg.valueType==2 then --比列数
             print("添加比例数----》")
            for k,v in pairs(cfg.value) do
                self:AddProportionValue(v,cfg.property[k])
            end
        end
    end

    --将属性同步到客户端
    self.player.attribute.MaxHp=self:GetMaxHp()
    self.player.attribute.Attack=self:GetAttack()
    self.player.attribute.Propulsion=self:GetPropulsion()
    self.player.attribute.Hp=math.floor(self.player.attribute.MaxHp*self.hpScale)

    self.UpdateEvent:Action()
    
end

-- 受伤
function M.Hurt(self,damge)
    local nowHp= self.player.attribute.MaxHp*self.hpScale
    local nextHp=nowHp-damge
    if nextHp>0 then
        self.hpScale=nextHp/self.player.attribute.MaxHp
    else
        nextHp=0
        self.hpScale=0
    end
    self.player.attribute.Hp=math.floor(self.player.attribute.MaxHp*self.hpScale)

    return nextHp

end

--恢复血量到最大值
function M.ResetHP(self)
    self.hpScale=1
    self.player.attribute.Hp=math.floor(self.player.attribute.MaxHp*self.hpScale)
end


--获取当前血量
function M.GetHp(self)
    return math.floor(self:GetMaxHp()*self.hpScale)
end

--获取最大hp
function M.GetMaxHp(self)
    return  self.baseHp*(1+self.baseHpScale)
end


--获取攻击力
function M.GetAttack(self)
    return self.baseAttack*self.baseAttackScale
end

--获取推进力
function M.GetPropulsion(self)
    return self.basePropulsion*self.basePropulsionScale
end


function M.dtor(self)
    M.super.dtor(self)
end

return M